#include"common.hpp"
#include<sys/wait.h>
//静态函数只能再本文件当中可见
//通过文件描述符来获取管道
// static void getMessage(int fd)
// {
//     char buffer[SIZE];
//     while(true)
//     {
//         memset(buffer,'\0',sizeof(buffer));
//         ssize_t s=read(fd,buffer,sizeof(buffer)-1);
//         if(s < 0)
//         {
//             perror("read fail");
//             exit(-1);
//         }
//         else if(s == 0)
//         {
//             cout<<"["<<getpid()<<"]"<<"read end of file"<<endl;
//             break;
//         }
//         else
//         {
//             cout<<"["<<getpid()<<"]"<<"client say:"<<buffer<<endl;
//         }
//     }
// }
// static void getMessage(int fd)
// {
//     char buffer[SIZE];
//     while(true)
//     {
//         ssize_t s=read(fd,buffer,sizeof(buffer)-1);
//         if(s > 0)
//         {
//             cout<<"["<<getpid()<<"]"<<"client say:"<<buffer<<endl;
//         }
//         else if(s == 0)
//         {
//             cout<<"["<<getpid()<<"]"<<"read end of file"<<endl;
//         }
//         else
//         {
//             perror("read file");
//             exit(-1);
//         }
//     }
// }
static void getMessage(int fd)
{
    char buffer[SIZE];
    while(true)
    {
        int s=read(fd,buffer,sizeof(buffer));
        if(s > 0)
        {
            cout<<"["<<getpid()<<"]"<<"client say:"<<buffer<<endl;
        }
        else if(s == 0)
        {
            cout<<"["<<getpid()<<"]"<<"read end of file"<<endl;
            break;
        }
        else
        {
            perror("read fail");
            exit(-1);
        }
    }
}
int main()
{
    int ret=mkfifo(ipcPath.c_str(),MODE);
    if(ret < 0)
    {
        perror("mkfifo");
        exit(-1);
    }
    Log("创建管道文件成功",Debug)<<"step 1"<<endl;
    int fd=open(ipcPath.c_str(),O_RDONLY);
    if(fd < 0)
    {
        perror("open fail");
        exit(-2);
    }
    Log("打开管道成功",Debug)<<"step 2"<<endl;
    int nums=3;
    for(int i=0;i<nums;i++)
    {
        pid_t id=waitpid(-1,nullptr,0);
        if(id == 0)
        {
            getMessage(fd);
            exit(1);
        }
    }
    for(int i=0;i<nums;i++)
    {
        waitpid(-1,nullptr,0);
    }
    close(fd);
    Log("关闭管道文件成功",Debug)<<"step 3"<<endl;
    unlink(ipcPath.c_str());
    Log("删除管道文件成功",Debug)<<"step 4"<<endl;
    return 0;
}
// int main()
// {
//     int ret=mkfifo(ipcPath.c_str(),MODE);
//     if(ret < 0)
//     {
//         perror("mkfifo");
//         exit(-1);
//     }
//     Log("创建管道文件成功",Debug)<<"step 1"<<endl;
//     int fd=open(ipcPath.c_str(),O_RDONLY);
//     if(fd < 0)
//     {
//         perror("read fail");
//         exit(-2);
//     }
//     Log("打开管道文件成功",Debug)<<"step 3"<<endl;
//     int nums=3;
//     for(int i = 0;i < nums;i++)
//     {
//         pid_t id=fork();
//         if(id == 0)
//         {
//             getMessage(fd);
//             exit(1);
//         }
//     }
//     //回收子进程资源
//     for(int i=0;i<nums;i++)
//     {
//         waitpid(-1,nullptr,0);
//     }
//     //关闭文件
//     close(fd);
//     Log("关闭管道文件成功",Debug)<<"step 3"<<endl;
//     unlink(ipcPath.c_str());
//     Log("删除管道文件成功",Debug)<<"step 4"<<endl;

//     return 0;
// }
// int main()
// {
//     if(mkfifo(ipcPath.c_str(),MODE) < 0)
//     {
//         perror("mkfifo");
//         exit(-1);
//     }
//     Log("创建命名管道成功",Debug)<<"step 1"<<endl;
//     int fd=open(ipcPath.c_str(),O_RDONLY);
//     if(fd < 0)
//     {
//         perror("open fail");
//         exit(-2);
//     }
//     Log("打开管道成功",Debug)<<"step 2"<<endl;
//     int nums=3;
//     for(int i=0;i<nums;i++)
//     {
//         pid_t id=fork();
//         if(id == 0)
//         {
//             getMessage(fd);
//             exit(1);
//         }
//     }
//     for(int i=0;i<nums;i++)
//     {
//         waitpid(-1,nullptr,i++);
//     }
//     close(fd);
//     Log("关闭管道文件成功",Debug)<<"step 3"<<endl;
//     unlink(ipcPath.c_str());
//     Log("删除管道文件成功",Debug)<<"step 4"<<endl;
//     return 0;
// }
// static void getMessage(int fd)
// {
//     char buffer[SIZE];
//     //这里读取信息是需要反复读取的
//     int s=read(fd,buffer,sizeof(buffer)-1);
//     if(s < 0)
//     {
//         perror("read fail");
//         exit(-1);
//     }
//     else if(s > 0)
//     {
//         cout<<"["<<getpid()<<"]"<<"client say:"<<buffer<<endl;
//     }
//     else
//     {
//         cout<<"["<<getpid()<<"]"<<"read end of file"<<endl;
//     }
// }
// static void getMessage(int fd)
// {
//     char buffer[SIZE];
//     while(true)
//     {
//         memset(buffer,'\0',sizeof(buffer));
//         ssize_t s=read(fd,buffer,sizeof(buffer)-1);
//         if(s > 0)
//         {
//             cout<<"["<<getpid()<<"]"<<"client say:"<<buffer<<endl;
//         }
//         else if(s == 0)
//         {
//             cout<<"["<<getpid()<<"]"<<"read end of file"<<endl;
//         }
//         else
//         {
//             perror("read fail");
//             exit(-1);
//         }
//     }
// }
// static void getMessage(int fd)
// {
//     char buffer[SIZE];
//     while(true)
//     {
//         memset(buffer,'\0',sizeof(buffer));
//         ssize_t s=read(fd,buffer,sizeof(buffer)-1);
//         if(s > 0)
//         {
//             cout<<"["<<getpid()<<"]"<<"client say"<<buffer<<endl;
//         }
//         else if(s == 0)
//         {
//             cerr<<"["<<getpid()<<"]"<<"read end of file"<<endl;
//         }
//         else
//         {
//             perror("read");
//             break;
//         }
//     }
// }
// static void getMessage(int fd)
// {
//     char buffer[SIZE];
//     while(true)
//     {
//         ssize_t s=read(fd,buffer,sizeof(buffer));
//         if(s > 0)
//         {
//             cout<<"["<<getpid()<<"]"<<"client say"<<buffer<<endl;
//         }
//         else if(s == 0)
//         {
//             cout<<"["<<getpid()<<"]"<<"read end of file"<<endl;
//         }
//         else
//         {
//             perror("read");
//             break;
//         }
//     }
// }
// int main()
// {
//     if(mkfifo(ipcPath.c_str(),MODE) < 0)
//     {
//         perror("mkfifo fail");
//         exit(-1);
//     }
//     Log("管道文件创建成功",Debug)<<"step 1"<<endl;
//     int fd=open(ipcPath.c_str(),O_RDONLY);
//     if(fd < 0)
//     {
//         perror("open");
//         exit(-2);
//     }
//     Log("代开管道文件",Debug)<<"step 2"<<endl;
//     //建立进程池
//     int nums=3;
//     for(int i=0;i<nums;i++)
//     {
//         pid_t id=fork();
//         if(id == 0)
//         {
//             getMessage(fd);
//             exit(1);
//         }
//     }
//     //回收所有的子进程
//     for(int i=0;i<nums;i++)
//     {
//         waitpid(-1,nullptr,0);
//     }
//     close(fd);
//     Log("关闭所有管道文件",Debug)<<"step 3"<<endl;
//     unlink(ipcPath.c_str());
//     Log("删除所有管道文件",Debug)<<"step 4"<<endl;
//     return 0;
// }
// int main()
// {
//     if(mkfifo(ipcPath.c_str(),MODE) < 0)
//     {
//         perror("mkfifo");
//         exit(-1);
//     }
//     Log("创建管道文件成功",Debug)<<"step 1"<<endl;
//     int fd=open(ipcPath.c_str(),O_RDONLY);
//     if(fd < 0)
//     {
//         perror("read");
//         exit(-2);
//     }
//     Log("打开管道文件成功",Debug)<<"step 2"<<endl;
    
//     int nums=3;
//     for(int i=0;i<nums;i++)
//     {
//         pid_t id=fork();
//         if(id == 0)
//         {
//             getMessage(fd);
//             exit(1);
//         }
//     }
//     for(int i=0;i<nums;i++)
//     {
//         waitpid(-1,nullptr,0);
//     }
//     close(fd);
//     Log("关闭管道文件",Debug)<<"step 3"<<endl;

//     unlink(ipcPath.c_str());
//     Log("删除管道文件成功",Debug)<<"step 4"<<endl;
//     return 0;
// }
// int main()
// {
//     if(mkfifo(ipcPath.c_str(),MODE) < 0)
//     {
//         perror("mkfifo");
//         exit(-1);
//     }
//     Log("创建管道文件成功",Debug)<<"step 1"<<endl;

//     int fd=open(ipcPath.c_str(),O_RDONLY);
//     if(fd < 0)
//     {
//         perror("open");
//         exit(-2);
//     }
//     Log("打开管道文件成功",Debug)<<"step 2"<<endl;

//     int nums=3;
//     for(int i=0;i<nums;i++)
//     {
//         pid_t id=fork();
//         if(id == 0)
//         {
//             getMessage(fd);
//             exit(1);
//         }
//     }
//     for(int i=0;i<nums;i++)
//     {
//         waitpid(-1,nullptr,0);
//     }
//     close(fd);
//     Log("管道关闭成功",Debug)<<"step 3"<<endl;
//     unlink(ipcPath.c_str());
//     Log("删除管道文件成功",Debug)<<"step 4"<<endl;
//     return 0;
// }
// static void getMessage(int fd)
// {
//     char buffer[SIZE];
//     while(true)
//     {
//         memset(buffer,'\0',sizeof(buffer));
//         ssize_t s=read(fd,buffer,sizeof(buffer)-1);
//         if(s > 0)
//         {
//             cout<<"["<<getpid()<<"]"<<"client say:"
//             <<buffer<<endl;
//         }
//         else if(s == 0)
//         {
//             cerr<<"["<<getpid()<<"]"<<"read end of file"<<endl;
//             break;
//         }
//         else
//         {
//             perror("read");
//             break;
//         }
//     }
// }
// static void getMessage(int fd)
// {
//     char buffer[SIZE];
//     while(true)
//     {
//         memset(buffer,'\0',sizeof(buffer));
//         ssize_t s=read(fd,buffer,sizeof(buffer)-1);
//         if(s > 0)
//         {
//             cout<<"["<<getpid()<<"]"<<"client say"<<buffer<<endl;
//         }
//         else if(s == 0)
//         {
//             cerr<<"["<<getpid()<<"]"<<"read end of file"<<endl;
//             break;
//         }
//         else
//         {
//             perror("read");
//             break;
//         }
//     }
// }
// static void getMessage(int fd)
// {
//     char buffer[SIZE];
//     ssize_t s=read(fd,buffer,sizeof(buffer)-1);
//     if(s > 0)
//     {
//         cout<<"["<<getpid()<<"]"<<"cliend say"<<buffer<<endl;
//     }
//     else if(s == 0)
//     {
//         cerr<<"["<<getpid()<<"]"<<"read end of file"<<endl;
//         break;
//     }
// }
// static void getMessage(int fd)
// {
//     char buffer[SIZE];
//     while(true)
//     {
//         memset(buffer,'\0',sizeof(buffer));
//         ssize_t s=read(fd,buffer,sizeof(buffer)-1);
//         if(s > 0)
//         {
//             cout<<"["<<getpid()<<"]"<<"client say"
//             <<buffer<<endl;
//         }
//         else if(s == 0)
//         {
//             cerr<<"["<<getpid()<<"]"
//             <<"read end of file,client quit,server quit"
//             <<endl;
//             break;
//         }
//         else
//         {
//             perror("read");
//             break;
//         }
//     }
// }

// int main()
// {
//     if(mkfifo(ipcPath.c_str(),MODE) < 0 )
//     {
//         perror("mkfifo");
//         exit(1);
//     }
//     Log("创建管道文件成功",Debug)<<"step 1"<<endl;

//     int fd=open(ipcPath.c_str(),O_RDONLY);
//     if(fd < 0)
//     {
//         perror("open");
//         exit(2);
//     }
//     Log("打开管道成功",Debug)<<"step 2"<<endl;
//     int nums=3;
//     for(int i = 0;i < nums;i++)
//     {
//         pid_t id=fork();
//         if(id == 0)
//         {
//             getMessage(fd);
//             exit(1);
//         }
//     }
//     for(int i = 0;i < nums ;i++)
//     {
//         waitpid(-1,nullptr,0);
//     }
//     close(fd);
//     Log("关闭管道文件成功",Debug)<<"step 3"<<endl;
//     unlink(ipcPath.c_str());
//     Log("删除管道文件成功",Debug)<<"step 4"<<endl;

//     return 0;
// }